package com.example.test.advice.第三章_类_对象_方法.建议44_推荐使用序列化实现兑现的拷贝;

import java.io.*;

/**
 * 对象拷贝注意点
 * 1、对象的内部属性都是可序列化的
 * 2、注意方法和属性的特殊修饰符
 *
 * 可以采用Apache的commons工具包中的SerializationUtils类来进行序列化
 */
public class CloneUtils {

    //拷贝一个对象
    public static <T extends Serializable> T clone(T obj){
        //拷贝产生的对象
        T cloneObj = null;
        try {
            //读取对象字节数据
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            oos.close();
            //分配内存空间，写入原始对象，生成新对象
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            //返回新对象，并做类型转换
            cloneObj = (T)ois.readObject();
            ois.close();
        }catch (Exception e){
            e.printStackTrace();
        }

        return cloneObj;
    }
}
